.TITLE TTMOD .IDENT /09.00/ ; ; Copyright (c) 1995-1999 by Mentec Inc., U.S.A. ; All rights reserved. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; ; 26-FEB-78 PETER WANNHEDEN ; ; PREVIOUSLY MODIFIED BY: ; ; P. WANNHEDEN ; C. F. SPITZ ; D. R. DONCHIN ; S. ADAMS ; T. SCHOELLER ; ; ; MODIFIED FOR RSX-11M-PLUS V4.4 BY: ; ; L. KOGAN 19-JUN-1990 08.00 ; LK758 - SET DEFAULT /NOPARITY ; ; L. KOGAN 19-JUN-1990 08.01 ; LK759 - SET CC-C =1 AND V=0 IN MODI5: CASE ; (DO NOT CHANGE LINE PARAMETERS) ; ; MODIFIED FOR RSX-11M-PLUS V4.5 BY: ; ; D. CARROLL 06-MAY-1993 09.00 ; DC204 - DON'T RESET TERMINAL ATTRIBUTES BASED ON BIT 3 ; ; .PSECT MAP5.6 ; ;+ ; TTMOD - MODEM SUPPORT ROUTINES. ; CONTAINS THE FOLLOWING ROUTINES: ; ; MODISR MODEM INTERRUPT SERVICE ROUTINE ; HLMTIM SUBROUTINE TO SERVICE TIME-OUT ; MANS SUBROUTINE TO ANSWER A CALL ON A LINE ; MHUP SUBROUTINE TO HANG UP A LINE ;- ; ; .IF DF T$$MOD .ENABL LSB ;+ ; MODISR - INTERRUPT SERVICE ROUTINE FOR DATASET STATUS CHANGE INTERRUPT ; ON DM11-BB, DL11-E OR DHV11, OR FROM DZ11 POLL SEQUENCE ; ; INPUT: ; R4 BIT 15: 1 IF INTERFACE SUPPORTS "DATASET READY" SIGNAL ; BIT 14: 1 IF DATASET SHOWS "DATASET READY" ; BIT 7: 1 IF RING HAS OCCURRED (DM11-BB) ; 1 IF LINE IS RINGING (DL11-E) ; 1 RING INTEGRATED OVER THREE SAMPLES (DHV11) ; BIT 6: 1 IF DATASET SHOWS "CLEAR TO SEND" ; BIT 5: 1 IF DATASET SHOWS "CARRIER ON" ; R5 POINTER TO U.TSTA ; ; OUTPUT: ; 1. IF LINE IS NOT REMOTE, DROP DTR. ; 2. IF LINE IS DISABLED AND NOT WAITING FOR CARRIER: ; 2.1 IF BIT 1 OF $TTPRM IS 0, AND NO RING SEEN, DROP DTR. ; 2.2 IF BIT 1 OF $TTPRM IS 0, AND RING SEEN, SET A TIMER FOR M$$ANS ; SECONDS AND RAISE DTR. (ANSWER A CALL AND WAIT FOR CARRIER.) ; 2.3 IF BIT 1 OF $TTPRM IS 1, AND DSR IS OFF, NO ACTION. ; 2.4 IF BIT 1 OF $TTPRM IS 1, AND DSR AND CARRIER AND CTS ARE ON, ; ENTER SUBROUTINE MANS TO ANSWER THE CALL. ; 2.5 IF BIT 1 OF $TTPRM IS 1, DSR IS NOT AVAILABLE AND CARRIER AND ; CTS ARE BOTH ON, SAME AS 2.4. ; 2.6 IF BIT 1 OF $TTPRM IS 1, DSR IS NOT AVAILABLE AND CARRIER AND ; CTS ARE NOT BOTH ON, NO ACTION. ; 2.7 IF BIT 1 OF $TTPRM IS 1, AND DSR IS ON BUT CARRIER AND CTS ARE ; NOT BOTH ON, SET A TIMER FOR M$$ANS SECONDS. (ANSWER A CALL ; AND WAIT FOR CARRIER.) ; 3. IF LINE IS DISABLED AND WAITING FOR CARRIER: ; (RING FLAG IS IGNORED) ; 3.1 IF DSR IS OFF, DROP DTR AND HANG UP THE LINE. ; 3.2 IF CARRIER AND CTS ARE ON, CLEAR WAITING FLAG AND ENTER ; SUBROUTINE "MANS". (CARRIER APPEARED WITHIN WAITING PERIOD ; M$$ANS AFTER ANSWERING A CALL.) ; 3.3 IF CARRIER OR CTS IS OFF, NO ACTION. ; 4. IF LINE IS ENABLED AND NOT WAITING FOR CARRIER: ; 4.1 IF DSR IS OFF, DROP DTR AND HANG UP THE LINE. ; 4.2 IF CARRIER AND CTS ARE BOTH ON, NO ACTION. ; 4.3 IF BIT 0 OF $TTPRM IS 0, AND CARRIER OR CTS IS OFF, SET A TIMER ; FOR M$$CAR SECONDS AND SET WAITING FLAG. (CARRIER LOST, WAIT FOR ; IT TO RETURN.) ; 4.4 IF BIT 0 OF $TTPRM IS 1, AND CARRIER OR CTS IS OFF, DROP DTR AND ; HANG UP THE LINE. ; 5. IF LINE IS ENABLED AND WAITING FOR CARRIER: ; (NOTE - THIS IS THE STATE THE LINE SHOULD STAY IN ; UNTIL A BYE COMMAND HAS BEEN SUCCESSFULLY QUEUED ; AFTER HAVING FAILED EARLIER AS RESULT OF HANG-UP. ; IN THIS STATE, DTR SHOULD BE OFF SO THAT CARRIER ; WILL NEVER BE SEEN - CASE 5.4 SHOULD NEVER HAPPEN.) ; 5.1 IF RING SEEN, DROP DTR AND HANG UP THE LINE. ; 5.2 IF DSR IS OFF, DROP DTR AND HANG UP THE LINE. ; 5.3 IF CARRIER OR CTS IS OFF, NO ACTION. (LINE STILL WITHOUT ; CARRIER, WAIT FOR CARRIER TO RETURN.) ; 5.4 IF CARRIER AND CTS ARE BOTH ON, CLEAR WAITING FLAG. ; (LINE RETURNED TO NORMAL CONDITION AFTER TEMPORARY ; LOSS OF CARRIER.) ; ; IN EITHER CASE: ; CC-V 0 ; CC-C 0 IF A CALL WAS ANSWERED ; 1 NO ACTION ; 1 ; CC-C 0 CALLER SHOULD ENABLE DTR AND RTS ; 1 CALLER SHOULD DISABLE DTR AND RTS ; ; REGISTERS ALTERED: R2,R4 ;- ; ; MODISR::BIT #U2.RMT,U.CW2-U.TSTA(R5) ;;;REMOTE LINE? BEQ 47$ ;;;N - IGNORE COMB R4 ;;;INVERT FLAGS ROLB R4 ;;;GET INVERTED RING FLAG IN CC-C MOVB U.STS-U.TSTA(R5),R2 ;;;GET DSB AND CRW FLAGS BIC #^C,R2 ;;;CLEAR JUNK BITS ASSUME US.DSB,2 ASSUME US.CRW,4 JMP @MDSP(R2) ;;;DISPATCH ACCORDING TO DSB AND CRW FLAGS ; ; CASE 2 - DISABLED AND NOT WAITING FOR CARRIER ; MODI2:: BIT #2,$TTPRM ;;;ENABLE DTR BEFORE RING? BNE 3$ ;;;Y - JUMP BCS 30$ ;;;RING NOT SEEN - NO ACTION MOVB #M$$ANS+1,U.TMTI-U.TSTA(R5) ;;;SET TIMER = M$$ANS SECONDS BISB #US.CRW,U.STS-U.TSTA(R5) ;;;SET CARRIER-WAIT FLAG SEV ;;;SET CC-V (CC-C IS CLEAR) TO RAISE DTR RETURN 3$: ROL R4 ;;;CHECK DSR FLAGS BVS 25$ ;;;DSR OFF - NO ACTION (BUT LEAVE DTR HIGH) BIT #600,R4 ;;;DSR ON (OR N/A) - HOW ABOUT CARRIER AND CTS? BEQ MANS ;;;CARRIER AND CTS BOTH ON - ANSWER THE CALL BCC 30$ ;;;DSR IS NOT AVAILABLE - NO ACTION TST R4 ;;;DSR IS AVAILABLE - IS IT ON? BEQ 30$ ;;;N - JUMP 5$: MOVB #M$$ANS+1,U.TMTI-U.TSTA(R5) ;;;SET TIMER = M$$ANS SECONDS BR 20$ ;;;GO AND WAIT FOR CARRIER ; ; CASE 3 - DISABLED AND WAITING FOR CARRIER ; MODI3:: ROL R4 ;;;CHECK DSR FLAGS BVS 45$ ;;;DSR WENT AWAY - HANG UP THE LINE BIT #600,R4 ;;;DSR ON (OR N/A) - CARRIER AND CTS BOTH ON? BNE 30$ ;;;N - JUMP BR MANS ;;;ANSWER CALL ; ; CASE 4 - ENABLED AND NOT WAITING FOR CARRIER ; MODI4:: ROL R4 ;;;CHECK DSR FLAGS BVS 45$ ;;;DSR WENT AWAY - HANG UP THE LINE BIT #600,R4 ;;;CARRIER AND CTS STILL BOTH ON? BEQ 30$ ;;;Y - JUMP BIT #1,$TTPRM ;;;DROP LINE IMMEDIATELY UPON LOSS OF CARRIER? BNE 45$ ;;;Y - JUMP MOVB #M$$CAR+1,U.TMTI-U.TSTA(R5) ;;;SET TIMER FOR M$$CAR SECONDS BR 20$ ;;;GO AND SET WAIT FLAG ; ; CASE 5 - ENABLED AND WAITING FOR CARRIER ; MODI5:: BCC 45$ ;;;RING - JUMP ROL R4 ;;;CHECK DSR FLAGS BVS 45$ ;;;DSR WENT AWAY - HANG UP THE LINE SEC ;;;SET CC-C BIT #600,R4 ;;;CARRIER AND CTS BOTH ON? BNE 40$ ;;;N - JUMP BIT #1,$TTPRM ;;;DROP LINE IMMEDIATELY? BNE 40$ ;;;NO - RETURN TO THE CALLER CALL 50$ ;;;BOTH ON - CLEAR WAITING FLAG BR 30$ ;;;AND EXIT WITH CC-C = 1 10$: MOVB #1,U.TMTI-U.TSTA(R5) ;;;SET TIMER = 1 SECOND 20$: BISB #US.CRW,U.STS-U.TSTA(R5) ;;;SET CARRIER-WAIT FLAG 25$: CLV ;;;SHOW NO ACTION 30$: SEC ;;;SHOW NO CALL ANSWERED 40$: RETURN ; ; COME HERE TO HANG UP LINE IMMEDIATELY ; 45$: CALL 10$ ;;;START TIMER, SET CARRIER-WAIT FLAG 47$: .WORD SEC!SEV ;;;SET CC-V AND CC-C TO DROP DTR UPON RETURN RETURN ; ; ;+ ; SUBROUTINE MANS - ANSWER A CALL. ; ; INPUT: ; R5 POINTER TO U.TSTA ; ; OUTPUT: ; UCB IS INITIALIZED. DISABLE AND CARRIER-WAIT FLAGS CLEARED. ; CC-C 0 TO INDICATE CALL ANSWERED. ; ; IF BIT 3 IN $TTPRM IS CLEAR, TERMINAL CHARACTERISTICS WILL BE RESET ; TO A KNOWN STATE, ELSE, IF SET, THEY WILL BE LEFT AS IS. ; ; REGISTERS ALTERED: NONE ;- ; ; MANS:: .IF DF USECDL!USECDH!USECDZ .IFTF ;USECDL!USECDH!USECDZ BIS #S2.FLF,2(R5) ;;;INITIALIZE STATUS WORD 2 CLC ;;;AND CLEAR CC-C .IFF BIT #10,$TTPRM ;;; SHOULD WE RESET CHARACTERISTICS? BNE 48$ ;;; IF NE, NOPE, DON'T DO THIS ... TST (R5)+ ;;;POINT TO 2ND STATUS WORD BIC #S2.WRA!S2.WRB!S2.CR,(R5)+ ;;;INITIALIZE STATUS WORDS BIC #S3.FDX!S3.8BC!S3.RAL!S3.PTH,(R5) ;;;CLEAR FULL DUPLEX, 8 BIT CHARACTERS, ;;;READ-ALL, NO-ECHO AND PASSTHRU BIS #S3.ACR,(R5)+ ;;;SET ACR BIC #^C,(R5) ;;; SUB #6,R5 ;;;POINT TO U.TSTA CLR U.TST5-U.TSTA(R5) ;;;CLEAR U.TST5 BIC #U2.CRT!U2.HLD!U2.L3S!U2.VT5!U2.ESC,U.CW2-U.TSTA(R5) ; DD168 ;;;INITIALIZE CHARACTERISTICS WORD 2 BIC #U3.UPC!U3.PAR,U.CW3-U.TSTA(R5) ;;;AND WORD 3 MOV #80.,U.CW4-U.TSTA(R5) ;;;AND WORD 4 CLRB U.TTYP-U.TSTA(R5) ;;;SET TERMINAL TYPE TO UNKNOWN 48$: ;;; REFERENCE LABEL .ENDC .IF DF R$$MPL!A$$CLI BIC #UM.CLI,U.MUP-U.TSTA(R5) ;;;SET MCR AS CLI .ENDC .IF DF M$$CLI MOV #$MCRPT,U.CLI-U.TSTA(R5) ;;;SET MCR AS CLI .ENDC .IF DF T$$SER BIC #UM.SER!UM.CMD,U.MUP-U.TSTA(R5) ;;;RESET SERIAL COMMAND MODE .ENDC .IF DF D$$M11!D$$ZMD!D$$VMD ASSUME S4.ABD,100000 TST 6(R5) ;;;AUTO-BAUD DETECT SET FOR THIS LINE? BPL 50$ ;;;IF NOT,DON'T START ABD DETECTION BIS #S5.ABP,U.TST5-U.TSTA(R5) ;;;Y - INITIATE AUTO-BAUD DETECTION MOV #S.4800,U.CW4-U.TSTA(R5) ;;;SET INITIAL AUTOBAUD SPEED .ENDC ;D$$M11!D$$ZMD!D$$VMD 50$: CLRB U.TMTI-U.TSTA(R5) ;;;STOP MODEM TIMER AND CLEAR CC-C 60$: BICB #US.DSB!US.CRW,U.STS-U.TSTA(R5) ;;;ENABLE LINE AND CLEAR WAITING FLAG RETURN ;;;RETURN WITH CC-V CLEAR .DSABL LSB ;+ ; HLMTIM - TIME-OUT ON DM11-BB, DL11-E, DHV11 OR DZ11 ; ; INPUT: ; R5 POINTER TO U.TSTA ; ; OUTPUT: ; IF CARRIER-WAIT FLAG = 0: ; IF LINE IS LOCAL, RETURN TO CALLER WITH Z-BIT SET, WHICH INDICATES ; THAT DTR AND RTS SHOULD BE DROPPED. ; IF LINE IS REMOTE, RETURN TO CALLER WITH Z-BIT CLEAR, WHICH INDICATES ; THAT DTR AND RTS SHOULD BE ASSERTED. ; ; ELSE: ; CALLER CALLED AS COROUTINE WITH INTERRUPTS LOCKED OUT. ; ON RETURN FROM CALLER, THE FOLLOWING IS EXPECTED: ; ; R5 UNCHANGED ; DTR AND RTS DROPPED. ;- ; ; HLMTIM::BITB #US.CRW,U.STS-U.TSTA(R5) ;;;ARE WE STILL WAITING? BNE 20$ ;;;Y - JUMP BIT #2,$TTPRM ;;;DON'T ASSERT DTR UNTIL RING? BEQ 10$ ;;;Y - JUMP (LEAVING CC-Z SET TO DROP DTR) BIT #U2.RMT,U.CW2-U.TSTA(R5) ;;;IS LINE REMOTE? 10$: RETURN ;;;RETURN TO CALLER WITH Z-BIT INDICATION 20$: SEZ ;;;SET Z-BIT TO TELL CALLER TO DROP DTR AND RTS CALL @(SP)+ ;;;CALL CALLER AS A COROUTINE CALL @(SP)+ ;;;ALLOW INTERRUPTS (RETURN TO LOCKI IS ;;;ASSUMED TO BE ON THE STACK) MOVB #M$$DIS+1,U.TMTI-U.TSTA(R5) ;SET TIMER = M$$DIS SECONDS BITB #US.DSB,U.STS-U.TSTA(R5) ;LINE ENABLED? BEQ MHUP ;Y - HANG UP THE LINE BICB #US.CRW,U.STS-U.TSTA(R5) ;CLEAR WAITING FLAG RETURN ; ; ;+ ; SUBROUTINE MHUP - HANG UP. ; MAY ONLY BE CALLED AT SYSTEM STATE! ; ; INPUT: ; R5 POINTER TO U.TSTA ; US.DSB 0 TO PREVENT THAT A RING IS ANSWERED BEFORE THE ; TERMINAL IS LOGGED OFF ; LINE PHYSICALLY HUNG UP (DTR AND RTS DROPPED). ; ; OUTPUT: ; IF ANY I/O WAS ACTIVE, IT IS KILLED. ; IF TERMINAL WAS LOGGED ON, A BYE COMMAND IS QUEUED. ; IF BYE COMMAND SUCCESSFULLY QUEUED: ; US.DSB 1 (LINE DISABLED) ; US.CRW 0 (NOT WAITING) ; ELSE: ; US.DSB 0 (LINE ENABLED) ; US.CRW 1 (WAITING) ; ; REGISTERS ALTERED: R0,R1,R2,R3,R4 ;- ; ; MHUP:: MOV #IE.DNR&377,R0 ;SET DEFAULT STATUS, IE.DNR LHMHUP::MOV R0,-(SP) ;SAVE STATUS BISB #US.CRW,U.STS-U.TSTA(R5) ;ASSUME FAILURE TO SEND BYE COMMAND ;THIS ALSO PREVENTS PROCESSING OF INPUT ;INTERRUPTS .IF DF T$$SPL MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ;MAP UCBX JUST IN CASE (IT MAY NOT BE ;MAPPED IF WE COME HERE FOR POWER UP PROCESSING) .ENDC ;T$$SPL CALL I1CTXL ;FLUSH TYPE-AHEAD BUFFER BIC #S5.ABP,U.TST5-U.TSTA(R5) ;RESET AUTO-BAUD MODE .IF DF T$$SPL MOV #120000,R4 ;SET VIRTUAL ADDRESS OF UCBX .IFF ;T$$SPL MOV U.TUX-U.TSTA(R5),R4 ;GET UCBX BEQ 10$ ;NONE - JUMP .ENDC ;T$$SPL ASSUME U.TITI&1,0 ;U.TITI MUST BE EVEN ASSUME U.TOTI,U.TITI+1 CLR U.TITI(R4) ;CLEAR INPUT AND OUTPUT TIMERS MOV (SP),R0 ;GET STATUS TO RETURN TO TASK CALL KILLI1 ;KILL INPUT (IF ANY IN PROGRESS) MOV (SP),R0 ;GET STATUS TO RETURN TO TASK CALL KILLO1 ;KILL OUTPUT (IF ANY IN PROGRESS) ;WITH STATUS IE.DNR 10$: TST (SP)+ ;GET RID OF STATUS OFF THE STACK .IF DF M$$MUP BIT #U2.LOG,U.CW2-U.TSTA(R5) ;TERMINAL LOGGED ON? BNE 20$ ;N - JUMP .IF DF T$$SPC CLR R1 ;SET STATUS TO REQUEST BYE MOV R5,R2 ;SET UCB ADDRESS SUB #U.TSTA,R2 ; CALL $QCNTP ;QUEUE A BYE COMMAND .IFF ;T$$SPC MOV #M$$CRB,R1 ;GET CLI COMMAND BUFFER LENGTH CALL $ALOCB ;ALLOCATE A CLI CMD BUFFER BCS 40$ ;FAILED - EXIT MOV R0,R1 ;COPY BUFFER POINTER TST (R0)+ ;SKIP OVER LINK WORD MOV R5,R2 ; SUB #U.TSTA,R2 ;GET UCB ADDRESS MOV R2,(R0)+ ;INSERT UCB ADDRESS MOV #"BY,(R0)+ ;INSERT "BYE" COMMAND MOV #'E!,(R0)+ CALL $QMCR ;QUEUE COMMAND TO MCR .ENDC ;T$$SPC .ENDC ;M$$MUP ; THE LINE MAY HAVE BECOME NON-REMOTE. IF SO, LEAVE IT ENABLED. ; 20$: BIT #U2.RMT,U.CW2-U.TSTA(R5) ;REMOTE LINE? BEQ 30$ ;N - JUMP .IF DF T$$MHU BIT #S3.MHE,4(R5) ;IS CHARACTERISTIC ENABLED? BEQ 25$ ;BR IF NO .IF DF T$$SPL MOV #120000,R4 ;POINT TO UCBX. .IFF ;T$$SPL MOV U.TUX-U.TSTA(R5),R4 ;POINT TO UCBX .ENDC ;T$$SPL MOV U.TMHA(R4),R1 ;GET ACB ADDRESS .IF DF T$$OVL MOV #QUEAEN,-(SP) CALL MPROT ;QUE AST TO TASK .IFF ;T$$OVL CALL QUEAEN ;QUEUE AST TO ATTACHED TASK .ENDC ;T$$OVL .ENDC ;T$$MHU 25$: BISB #US.DSB,U.STS-U.TSTA(R5) ;Y - DISABLE 30$: BICB #US.CRW,U.STS-U.TSTA(R5) ;CLEAR CARRIER-WAIT FLAG 40$: RETURN ; .ENDC ;T$$MOD ; ; .END